package com.hzlj.position.config.rest.wd;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.fz.common.base.core.date.DateUtils;
import com.fz.common.base.enums.CoordinateType;
import com.fz.common.base.exception.PubException;
import com.hzlj.position.config.common.dto.common.PositionAddDTO;
import com.hzlj.position.config.common.dto.wdConfig.WdConfigQueryResultDTO;
import com.hzlj.position.config.common.enums.WarningType;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.function.BiFunction;

import static cn.hutool.core.date.DatePattern.NORM_DATETIME_PATTERN;
import static com.hzlj.position.config.config.IdConfig.POSITION_ID_GEN;

/**
 * @author lifh
 * @date 2022/10/12 15:51
 **/
public interface WdLocateRest {
    /**
     * 根据imei码获取位置信息
     */
    PositionAddDTO fetchPosition(WdConfigQueryResultDTO config,
                                 String jgCode,
                                 String imei,
                                 BiFunction<String, String, String> dictFun);

    /**
     * 获取报警信息
     */
    default List<PositionAddDTO> fetchAlarmsPositions(WdConfigQueryResultDTO config,
                                                      String jgCode,
                                                      Date startTime,
                                                      Date endTime,
                                                      BiFunction<String, String, String> dictFun) {
        throw new PubException(String.format("未实现获取腕带告警功能:jgCode=%s", jgCode));
    }

    /**
     * 开户
     */
    default void enablePosition(WdConfigQueryResultDTO config,
                                String jgCode,
                                String imei) {
        throw new PubException(String.format("未实现自动开启腕带定位功能:jgCode=%s,imei=%s", jgCode, imei));
    }

    /**
     * 销户
     */
    default void disablePosition(WdConfigQueryResultDTO config,
                                 String jgCode,
                                 String imei) {
        throw new PubException(String.format("未实现自动关闭腕带定位功能:jgCode=%s,imei=%s", jgCode, imei));
    }


    /**
     * 修改间隔
     */
    default void updateLocateInterval(WdConfigQueryResultDTO config,
                                      String jgCode,
                                      String imei,
                                      Integer locateInterval) {
        throw new PubException(String.format("未实现修改腕带定位频率功能:jgCode=%s,imei=%s", jgCode, imei));
    }

    /**
     * 关机
     */
    default void shutdown(WdConfigQueryResultDTO config,
                          String jgCode,
                          String imei) {
        throw new PubException(String.format("未实现关机功能:jgCode=%s,imei=%s", jgCode, imei));
    }

    /**
     * 重启
     */
    default void reboot(WdConfigQueryResultDTO config,
                        String jgCode,
                        String imei) {
        throw new PubException(String.format("未实现重启功能:jgCode=%s,imei=%s", jgCode, imei));
    }

    /**
     * 发送告警消息
     */
    default void sendText(WdConfigQueryResultDTO config,
                          String jgCode,
                          String imei,
                          String text) {
        throw new PubException(String.format("未实现发送消息功能:jgCode=%s,imei=%s", jgCode, imei));
    }


    /**
     * 腕带名称
     */
    String wdName();

    /**
     * 获取腕带错误码字典
     */
    default String wdDictType() {
        return null;
    }

    /**
     * 默认位置类
     */
    default PositionAddDTO defaultPosition(String imei,
                                           BigDecimal lon,
                                           BigDecimal lat,
                                           String positionTime,
                                           CoordinateType type,
                                           WdConfigQueryResultDTO config) {
        PositionAddDTO position = new PositionAddDTO();
        position.setId(POSITION_ID_GEN.nextIdStr());
        position.setChannel(config.getChannel());
        position.setChannelType(config.getChannelType());
        //时间
        position.setPositionTime(positionTime == null ?
                DateUtils.parseDate(new Date(), NORM_DATETIME_PATTERN) :
                DateUtil.parseDateTime(positionTime)
        );
        position.setDeviceCode(imei);
        position.setWarningType(WarningType.SUCCESS.getCode());
        position.setReportType("21");//腕带定位
        //坐标转换
        if (ObjectUtil.isAllNotEmpty(type, lon, lat)) {
            String[] wgs84 = type.toWGS84(lon.toPlainString(), lat.toPlainString());
            position.setLongitude(wgs84[0]);
            position.setLatitude(wgs84[1]);
        }
        position.setPosition(StrUtil.format("【{}】{}", "-1", "定位失败，接口请求有误"));
        return position;
    }
}
